package main;

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Vector;

import jugadores.Jugador;

import org.hibernate.Session;

import sessionManager.SessionManager;
import strategy.FormacionStrategy;
import strategy.FormacionStrategyImpl;
import unq.tpi.futbol.AbstractHibernateTest;
import Partido.PartidoDeCopa;
import Partido.PartidoSimple;
import equipos.Equipo;
import equipos.Tecnico;

/**
 * TODO: description
 */
public class Main extends AbstractHibernateTest {

    public Set<Jugador> armarJugadores(final Equipo equipo) {
        Set<Jugador> jugadores = new HashSet<Jugador>();

        for (int i = 0; i < 20; i++) {
            String nombre = "J" + i + " " + equipo.getNombre();
            jugadores.add(new Jugador(nombre));
        }
        return jugadores;
    }

    public List<Equipo> armarEquipos() {
        FormacionStrategy formacion = new FormacionStrategyImpl();

        Tecnico tecnBoca = new Tecnico("Falcioni", formacion);
        Tecnico tecnRiver = new Tecnico("Almeyda", formacion);
        Tecnico tecnRacing = new Tecnico("Zubeldia", formacion);
        Tecnico tecnRosario = new Tecnico("Che Guevara", formacion);
        Tecnico tecnTigre = new Tecnico("Arruabarrena", formacion);
        Tecnico tecnInstituto = new Tecnico("Branca", formacion);
        Tecnico tecnSanLorenzo = new Tecnico("Caruso", formacion);
        Tecnico tecnQuilmes = new Tecnico("sin dt", formacion);
        Tecnico tecnVelez = new Tecnico("Gareca", formacion);
        Tecnico tecnIndependiente = new Tecnico("Diaz", formacion);

        Equipo boca = new Equipo("Boca Juniors", tecnBoca);
        Equipo river = new Equipo("River Plate", tecnRiver);
        Equipo racing = new Equipo("Racing", tecnRacing);
        Equipo rosarioCentral = new Equipo("Rosario Central", tecnRosario);
        Equipo tigre = new Equipo("Tigre", tecnTigre);
        Equipo instituto = new Equipo("Instituto", tecnInstituto);
        Equipo sanLorenzo = new Equipo("San Lorenzo", tecnSanLorenzo);
        Equipo quilmes = new Equipo("Quilmes", tecnQuilmes);
        Equipo velez = new Equipo("Velez Sarfield", tecnVelez);
        Equipo independiente = new Equipo("El diablo", tecnIndependiente);

        boca.setJugadores(this.armarJugadores(boca));
        river.setJugadores(this.armarJugadores(river));
        racing.setJugadores(this.armarJugadores(racing));
        rosarioCentral.setJugadores(this.armarJugadores(rosarioCentral));
        tigre.setJugadores(this.armarJugadores(tigre));
        instituto.setJugadores(this.armarJugadores(instituto));
        sanLorenzo.setJugadores(this.armarJugadores(sanLorenzo));
        quilmes.setJugadores(this.armarJugadores(quilmes));
        velez.setJugadores(this.armarJugadores(velez));
        independiente.setJugadores(this.armarJugadores(independiente));

        List<Equipo> equipos = new Vector<Equipo>();
        equipos.add(boca);
        equipos.add(river);
        equipos.add(racing);
        equipos.add(rosarioCentral);
        equipos.add(tigre);
        equipos.add(sanLorenzo);
        equipos.add(instituto);
        equipos.add(quilmes);
        equipos.add(velez);
        equipos.add(independiente);

        return equipos;

    }

    public PartidoSimple armarPartidoSimple(final Equipo local, final Equipo visitante) {
        // Me aseguro que los goles en total no sean mas de 6 por partido
        int golesLocal = (int) (Math.random() * 4);
        int golesVisitante = (int) (Math.random() * 4);

        // while (golesLocal > 3) {
        // golesLocal = (int) (Math.random() * 5);
        // }
        //
        // while (golesVisitante > 3) {
        // golesVisitante = (int) (Math.random() * 5);
        // }

        return new PartidoSimple(local.armarFormacion(), visitante.armarFormacion(), golesLocal, golesVisitante);
    }

    public PartidoDeCopa armarPartidoDeCopa(final Equipo equipoA, final Equipo equipoB) {
        PartidoSimple primerPartidoSimple = this.armarPartidoSimple(equipoA, equipoB);
        PartidoSimple segundoPartidoSimple = this.armarPartidoSimple(equipoB, equipoA);
        return new PartidoDeCopa(primerPartidoSimple, segundoPartidoSimple);
    }

    /**
     * Retorna un set de 5000 partidos de copa
     */
    public Set<PartidoDeCopa> armarPartidosDeCopa(final List<Equipo> equipos) {
        Set<PartidoDeCopa> partidosDeCopa = new HashSet<PartidoDeCopa>();
        int contador = 0;
        while (contador < 4900) {

            // se saca el primer equipo de la lista
            Equipo equipoA = equipos.remove(0);
            // el equipo sacado juega contra el resto de los equipos
            for (Equipo equipoB : equipos) {
                partidosDeCopa.add(this.armarPartidoDeCopa(equipoA, equipoB));
                contador++;

                if (contador == 4900) {

                    break;
                }
            }
            // se retorna el quipo previamente sacado al final de la lista
            equipos.add(equipoA);
        }
        return partidosDeCopa;
    }

    /**
     * Arma y persiste 5000 partidos de copa
     */
    public void testArmarPartidosDeCopa() {
        SessionManager sessionManager = SessionManager.getInstance();
        Session session = sessionManager.getSession();

        Set<PartidoDeCopa> partidos = this.armarPartidosDeCopa(this.armarEquipos());
        for (PartidoDeCopa partido : partidos) {
            session.saveOrUpdate(partido);
        }

        session.flush();
        session.close();
    }

}
